<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!--引入fn函数库-->
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt_rt"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ page language="java"  import="java.util.*"%>

<%--使用JSP的指令元素指定要使用的JavaBean --%>
<%--@ page import="com.dd.Person" --%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<title>JSTL: --表达式控制标签“set”标签的使用</title>
	</head>

	<body>
		<h3>代码给出了给指定scope范围赋值的示例。</h3>
		<ul>
			<%--通过<c:set>标签将data1的值放入page范围中。--%>
			<li>把一个值放入page域中:
				<c:set var="data1" value="xdp" scope="page" />
			</li>
			<%--使用EL表达式从pageScope得到data1的值。--%>
			<li>从page域中得到值：${pageScope.data1}</li>
			<%--通过<c:set>标签将data2的值放入request范围中。--%>
			<li>把一个值放入request域中:
				<c:set var="data2" value="getreq" scope="request" />
			</li>
			<%--使用EL表达式从request得到data2的值。--%>
			<li>从request域中得到值：${requestScope.data2}</li>

			<%--通过<c:set>标签将data2的值放入session范围中。--%>
			<li>把一个值放入session域中:
				<c:set var="data3" value="getreq" scope="session" />
			</li>
			<%--使用EL表达式从session得到data3的值。--%>
			<li>从request域中得到值：${sessionScope.data3}</li>
			<%--不指定范围使用EL自动查找得到值 --%>
			<li>未指定scope的范围，会从不同的范围内查找得到相应的值： ${data1},${data2},${data3}
			</li>
		</ul>

		<hr/>
		<h3>使用Java脚本实现以上功能</h3>
		<ul>
			<li>把一个值放入page域中。
				<%pageContext.setAttribute("data3","xdp");%>
			</li>
			<li>从page域中得到值:
				<%out.println(pageContext.getAttribute("data3"));%>
			</li>
			<li>把一个值放入request域中。
				<%request.setAttribute("data2","gacl");%>
			</li>
			<li>从request域中得到值:
				<%out.println(request.getAttribute("data2"));%>
			</li>
			<li>把一个值放入session域中。
				<%session.setAttribute("name1","uy");%>
			</li>
			<li>从session中域得到值:
				<%out.println(session.getAttribute("name1"));%>
			</li>
			<%--out.println()方法与<%=%>表达式输出功能一样 --%>
			<%--	但使用表达式输出（<%=%>）明显要比使用out.println()输出更好。 --%>
			<li>
				<%=session.getAttribute("name1") %>
			</li>
			<li>未指定scope的范围，会从不同的范围内查找得到相应的值：
				<%=pageContext.findAttribute("data1")%>、
				<%=pageContext.findAttribute("data2")%>、
				<%=pageContext.findAttribute("name1")%>、
				<%=pageContext.findAttribute("name2")%>
			</li>

		</ul>

		<hr/>
		<h3>操作JavaBean，设置JavaBean的属性值</h3>
		<%--设置JavaBean的属性值，等同与setter方法，Target指向实例化后的对象，property指向要插入值的参数名。
    	注意：使用target时一定要指向实例化后的JavaBean对象，也就是要跟配套使用，
    		也可以java脚本实例化，但这就失去了是用标签的本质意义。
    		使用Java脚本实例化：--%>
		<jsp:useBean id="person" class="com.test.Person" />
		<%--@page import="com.dd.Person" --%>
		<%-- Person person=new Person();--%>
		<c:set target="${person}" property="user" value="pp" />

		<h4>从Bean中获得的name值为：<c:out value="${person.user}"></c:out></h4>

		<h3>操作Map</h3>
		<%
      Map map = new HashMap();
      request.setAttribute("map",map);
      %>
		<%--将data对象的值存储到map集合中 --%>
		<c:set property="data" value="gacl" target="${map}" /> ${map.data}
		
		
		<c:set var="name" scope="session">fdas</c:set>
		<%--使用remove标签移除age变量 --%>
		<c:remove var="name"/>
		<c:out value="${sessionScope.name}"/>
		
		<%--把容易产生异常的代码放在<c:catch></c:catch>中，
		自定义一个变量errorInfo用于存储异常信息 --%>
		<c:catch var="errorInfo">
		 	<%--实现了一段异常代码，向一个不存在的JavaBean中插入一个值--%>
		 	<c:set target="person" property="hao"></c:set>
		</c:catch>
		
		<%--用EL表达式得到errorInfo的值，并使用<c:out>标签输出 --%>
		异常：<c:out value="${errorInfo}" /><br />
		异常 errorInfo.getMessage：<c:out value="${errorInfo.message}" /><br />
		 
		 <hr />
		 <form action="set.jsp" method="post">
		 	<input type="text" name="uname" value="${param.uname}" />
		 	<input type="submit" value="登录" />
		 </form>
		 <%--使用if标签进行判断并把检验后的结果赋给adminchock，存储在默认的page范围中。 --%>
		  <c:if test="${param.username=='admin'}" var="adminchock">
		  <%--可以把adminchock的属性范围设置为session，这样就可以在其他的页面中得到adminchock的值，
		  	使用<c:if text=”${adminchock}”><c:if>判断，实现不同的权限。 --%>
		  	 <c:out value="管理员欢迎您！"/>
		  </c:if>
		  <%--使用EL表达式得到adminchock的值，如果输入的用户名为admin将显示true。 --%>
		  ${adminchock}
		  
		  
		<hr/>
		<%--通过set标签设定score的值为85 --%>
		<c:set var="score" value="85"/>
		<c:choose>
			<%--使用<c:when>进行条件判断。
			如果大于等于90，输出“您的成绩为优秀”；
			如果大于等于70小于90，输出“您的成绩为良好”；
			大于等于60小于70，输出“您的成绩为及格”；
			其他（otherwise）输出“对不起，您没能通过考试”。
			--%>
			<c:when test="${score>=90}">
				你的成绩为优秀！
			</c:when>
			<c:when test="${score>70 && score<90}">
				您的成绩为良好!
			</c:when>
			<c:when test="${score>60 && score<70}">
				您的成绩为及格
			</c:when>
			
			<c:otherwise>
				对不起，您没有通过考试！
			</c:otherwise>
		</c:choose>
		
		<h4/>
			<c:out value="oreach实例"/>
		<%
			List<String> list=new ArrayList<String>();
			list.add("ss");
			list.add("ss");
			list.add("ss");
			list.add("ss");
			request.setAttribute("list",list);
		%>
		<br/>
		<c:out value="不指定begin和end的迭代："/>
		<%--不使用begin和end的迭代，从集合的第一个元素开始，遍历到最后一个元素。 --%>
		<c:forEach var="fa" items="${list}">
			<c:out value="${fa}"/>
		</c:forEach>
		
		<c:out value="指定begin和end的迭代："/>
		<%--
		指定begin的值为1、end的值为3、step的值为2，
		从第二个开始首先得到晶晶，每两个遍历一次，
		则下一个显示的结果为莹莹，end为3则遍历结束。
		--%>
		<c:forEach var="fa" items="${list}" begin="1" end="3" step="2">
			<c:out value="${fa}"/>
		</c:forEach>
		
		<B><c:out value="输出整个迭代的信息：" /></B><br>
		<%--指定varStatus的属性名为s，并取出存储的状态信息 --%>
		<c:forEach var="fa" items="${list}" begin="3" end="4"
			varStatus="s" step="1">
		<c:out value="${fa}">四种属性</c:out>
		所在位置，即索引：<c:out value="${s.index}" /><br>
		总共已迭代的次数：<c:out value="${s.count}" /><br>
		是否为第一个位置：<c:out value="${s.first}" /><br>
		是否为最后一个位置：<c:out value="${s.last}" /><br>  
		</c:forEach>
	</body>

</html>